package com.example.sup.utils;

import cn.hutool.json.JSONUtil;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName RedisUtils
 * @Description {TODO}
 * @Author 李哲
 * @Date 16:33 2024/7/20
 * @Version 1.0
 */
@Component
public class RedisUtils {

    private StringRedisTemplate stringRedisTemplate;

    private RedisTemplate<String, Object> redisTemplate;

    private ValueOperations<String, String> valueOperations;

    public RedisUtils(RedisTemplate<String, Object> redisTemplate, ValueOperations<String, String> valueOperations,
                      StringRedisTemplate stringRedisTemplate) {
        this.redisTemplate = redisTemplate;
        this.valueOperations = valueOperations;
        this.stringRedisTemplate = stringRedisTemplate;
    }
    public static final long DEFAULT_EXPIRE = 60 * 60 * 24;
    public static final long NO_EXPIRE = -1;

    /**
     *  设置string类型值，同时设置过期时间
     * @param key   键
     * @param value 值
     * @param expireTime 过期时间 ，单位是秒
     */
    public void set(String key, Object value,long expireTime) {
        valueOperations.set(key, JSONUtil.toJsonStr(value));
        if(expireTime!=NO_EXPIRE){
            redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
        }
    }

    /**
     * 设置string类型值，默认过期时间为1天
     * @param key   键
     * @param value 值
     */
    public void set(String key, Object value) {
        set(key,value,DEFAULT_EXPIRE);
    }

    /**
     *  从redis获取字符串值，并转为对应对象，并设置过期时间
     * @param key       键
     * @param clazz     对象class
     * @param expireTime 过期时间
     * @param <T>       对象类
     * @return
     */
    public <T> List<T> get(String key, Class<? extends    T> clazz, long expireTime) {
        String value = valueOperations.get(key);
        if(expireTime!=NO_EXPIRE){
            redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
        }
        return (List<T>) JSONUtil.toList(value, clazz);
    }
    /**
     *  从redis获取字符串值，并转为对应对象
     * @param key       键
     * @param clazz     对象class
     * @param <T>       对象类
     * @return
     */

    public <T> List<T> get(String key,Class<? extends  T> clazz) {
        return get(key,clazz,NO_EXPIRE);
    }

    /**
     * 根据可以,从redis中删除字符串类型值值.
     * @param key 键
     * @return
     */
    public Boolean delete(String key) {
        return redisTemplate.delete(key);
    }

    /**
     * 根据正则表达式查询符合条件的keys，然后进行批量删除
     * @param pattern   正在表达式
     * @return
     */

    public Long batchDelete(String pattern){
        Set<String> keys = redisTemplate.keys(pattern);
        return redisTemplate.delete(keys);

    }


    /**
     * 根据键获取字符串值
     * @param key  键
     * @return
     */
    public String getString(String key){
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 根据key设置字符串value，默认过期时间为：1天
     * @param key
     * @param value
     */
    public void setString(String key ,String value){
        set(key,value,DEFAULT_EXPIRE);
    }

    /**
     * 根据key设置字符串value和过期时间
     * @param key
     * @param value
     * @param expire
     */
    public void setString(String key ,String value,long expire){
        stringRedisTemplate.opsForValue().set(key,value,expire);
    }

}
